/**************************************************************************
***    
*** Copyright (c) 1995-2000 Regents of the University of California,
***               Andrew E. Caldwell, Andrew B. Kahng and Igor L. Markov
*** Copyright (c) 2000-2002 Regents of the University of Michigan,
***               Saurabh N. Adya and Igor L. Markov
***
***  Contact author(s): abk@cs.ucsd.edu, imarkov@umich.edu
***  Original Affiliation:   UCLA, Computer Science Department,
***                          Los Angeles, CA 90095-1596 USA
***
***  Permission is hereby granted, free of charge, to any person obtaining 
***  a copy of this software and associated documentation files (the
***  "Software"), to deal in the Software without restriction, including
***  without limitation 
***  the rights to use, copy, modify, merge, publish, distribute, sublicense, 
***  and/or sell copies of the Software, and to permit persons to whom the 
***  Software is furnished to do so, subject to the following conditions:
***
***  The above copyright notice and this permission notice shall be included
***  in all copies or substantial portions of the Software.
***
*** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
*** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
*** OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
*** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
*** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
*** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
*** THE USE OR OTHER DEALINGS IN THE SOFTWARE.
***
***
***************************************************************************/




//This file defines the inline node functions.  they must be defined
//after HGraphFixed is defined.  They are in a seperate file because
//otherwise the single .h file becomes very large.
//This file is included at the end of hgFixed.h
//
// 020811 ilm ported to g++ 3.0


inline HGWeight HGFNode::getWeight(unsigned which) const
{
    if(which < _graph->getNumMultiWeights())
	return _graph->_multiWeights[_index*_graph->getNumMultiWeights()+which];
    else
    {
        std::vector<HGWeightPair>::const_iterator p;
	for(p = weightPairsBegin(); p != weightPairsEnd() && p->first <= which; p++)
	    if(p->first == which) return p->second;

	return 0;
    }
}

inline void HGFNode::setWeight(HGWeight weight, unsigned which)
{
    if(which < _graph->getNumMultiWeights())
	_graph->_multiWeights[_index*_graph->getNumMultiWeights()+which] = weight;
    else
    {
        std::vector<HGWeightPair>::const_iterator p;
	for(p = weightPairsBegin(); p != weightPairsEnd() && p->first <= which; p++)
	    if(p->first == which) 
//		 const_cast<std::pair<unsigned,double>*>
			  const_cast<double&>((p)->second) = weight;
    }
}

inline unsigned HGFNode::getNumWeights() const
{ return _graph->getNumMultiWeights() + getNumWeightPairs(); }

inline const char* HGFNode::getName() const
{ return _graph->_nodeNames[_index]; }

inline ostream& operator<<(ostream& out, const HGFNode* node)
{ 
           out<<*node<<endl;
    return out;
}

inline std::vector<HGWeightPair>::const_iterator HGFNode::weightPairsBegin() const
                        { return _graph->_binWeights.begin()+_binWtBegin;}

inline std::vector<HGWeightPair>::const_iterator HGFNode::weightPairsEnd() const
                        { return _graph->_binWeights.begin()+_binWtEnd;}
